package Q17_24_Max_Submatrix; import CtCILibrary.AssortedMethods; public class QuestionC { public static SubMatrix getMaxMatrix(int[][] matrix) { int rowCount = matrix.length; int colCount = matrix[0].length; SubMatrix best = null; for (int rowStart = 0; rowStart < rowCount; rowStart++) { int[] partialSum = new int[colCount]; for (int rowEnd = rowStart; rowEnd < rowCount; rowEnd++) { /* Add values at row rowEnd. */ for (int i = 0; i < colCount; i++) { partialSum[i] += matrix[rowEnd][i]; } Range bestRange = maxSubArray(partialSum, colCount); if (best == null || best.getSum() < bestRange.sum) { best = new SubMatrix(rowStart, bestRange.start, rowEnd, bestRange.end, bestRange.sum); } } } return best; } public static Range maxSubArray(int[] array, int N) { Range best = null; int start = 0; int sum = 0; for (int i = 0; i < N; i++) { sum += array[i]; if (best == null || sum > best.sum) { best = new Range(start, i, sum); } /* If running_sum is < 0 no point in trying to continue the * series. Reset. */ if (sum < 0) { start = i + 1; sum = 0; } } return best; } public static void main(String[] args) { int[][] matrix = AssortedMethods.randomMatrix(10, 10, -5, 5); AssortedMethods.printMatrix(matrix); System.out.println(getMaxMatrix(matrix)); } }